//---------------------------------------------------------------------------

#ifndef SelecteurOptimiseurReelH
#define SelecteurOptimiseurReelH

//---------------------------------------------------------------------------
extern int GlobRandomTable[];
extern int GlobRandomBase;
extern int GlobRandomInd;

class SelecteurOptimiseurReel {
public :
	SelecteurOptimiseurReel (int nbParams, double inertieUp, double inertieDown);
  ~SelecteurOptimiseurReel (void);

  int GetParamOptimum (void);
  void SuccessIs (double result, double gain = 0.0);
  inline double GetPoidsMethode (int m) {return m < NbParams ? Poids [m] : 0.0;}
  virtual double GetPctMethode (int m);
	inline int GetRensMenthode (int m) {return m < NbParams ? Rens [m] : 0;}
  void SetNbParams2 (int nbParams);
  void SetActivatedParam (int v) {ActivatedParam = (v < 0 || v >= NbParams) ? ActivatedParam : v;}
  inline int GetNbParams (void) {return NbParams;}
  inline int GetActivatedParam (void) {return ActivatedParam;}
  void SuccesImpossible (void);
  virtual void Reinit (void);
  void SetMaxPoidsTo (int i, double v);
  void ResetParam (int i);
  inline void Fixer (void) {Used == true ? Fixed = true : Fixed = false;}
  inline void SetRandomMode (bool randomMode) {RandomMode = randomMode;}
  inline double GetGainMax (void) {return GainMax;}
  inline double GetLastPerf (void) {return LastPerf;}
  inline double GetLastGain (void) {return LastGain;}
  inline double GetEvoResultMoyen (void) {return EvoResultMoyen;}

protected :
	double * Poids;
	int * Rens;
  double * MaxPoids;
	int NbParams;
  int AllocNbParams;
  int ActivatedParam;
  double InertieUp;
  double InertieDown;
  bool Vierge;
  bool Fixed;
  bool RandomMode;
  bool Used;
  double GainMax;
  double ResultMax;
  double ResultMoyen;
  double EvoResultMoyen;
  double ResultMin;
  double NoteMax;
  double NoteMoyen;
  double NoteMin;
  double PctMoyen;
  int CountUsed;
  double LastPerf;
  double LastGain;

};

void Trace (const char * c, bool withBeep = true);
int GetRandom (int base);
int GetApproxRandom (int base);
double GetRandomValue (double min, double max);

#endif
